# 45. collections模块的双端对列

# collections模块 - 数据类型的扩展模块

在说什么是双端队列前,说说什么是对列

队列:遵守先进先出的规定,不允许人员查看存储的数据,一切的数据的存入跟取出都遵守先进先出的顺序

那什么是双端队列

双端队列:不像队列的限制那么多,遵守的是双进双出,提供左右两边存储数据的方法,也提供分别在左右两边取出数据的方法,也提供人员查看存储的数据,可以指定删除指定的数据,可以在指定的位置添加数据

双端队列:采用的是C语言的链表结构,来构造双端队列的类型

双端队列,跟列表互补

  1. 双端队列一般使用在需要经常插入和删除元素的情况下
    1. 因为链接的特性,使双端队列在插入和删除的操作会很快,在大量的执行插入和删除操作,双端队列比列表速度快近10倍,但是双端队列的查询速度远比列表的差
  2. 列表一般用于需要经常查询访问元素的情况下
    1. 因为列表的特性,比如删除,只要列表执行删除第10个的数据,那么第10个的数据删除了,那位置是不是空了,列表就会自动的执行,将后面的数据全部提前一位,这样的删除速度就会相当慢,插入也一样,插入到10行,那10行以下的所有数据都要下降一位,一旦执行大量的删除跟插入操作,速度会变得很慢,在这里建议使用双端队列

# 双端队列

使用list存储数据时,按索引访问元素很快,但是插入和删除元素就很慢了,因为list是线性存储,数据量大的时候,插入和删除效率很低。

deque是为了高效实现插入和删除操作的双向列表,适合用于队列和栈

## 向右边添加
from collections import deque
dq = deque()
dq.append(2)
dq.append(5)

执行结果:
deque([2, 5])


## 向左边添加
from collections import deque
dq = deque()
dq.append(2)
dq.append(5)
dq.appendleft('a')
dq.appendleft('b')
print(dq)

执行结果:
deque(['b', 'a', 2, 5])

   
## 向右边取出一个数据
from collections import deque
dq = deque()
dq.append(2)
dq.append(5)
dq.appendleft('a')
dq.appendleft('b')
print(dq)
print(dq.pop())
print(dq)

执行结果:
deque(['b', 'a', 2, 5])
5
deque(['b', 'a', 2])


## 向左边取出一个数据
from collections import deque
dq = deque()
dq.append(2)
dq.append(5)
dq.appendleft('a')
dq.appendleft('b')
print(dq)
print(dq.popleft())
print(dq)

执行结果:
deque(['b', 'a', 2, 5])
b
deque(['a', 2, 5])


## 删除指定的数据
from collections import deque
dq = deque()
dq.append(2)
dq.append(5)
dq.appendleft('a')
dq.appendleft('b')
print(dq)
dq.remove('a')
print(dq)

执行结果:
deque(['b', 'a', 2, 5])
deque(['b', 2, 5])


## 在指定的位置添加数据 从0开始,默认从左边开始添加
from collections import deque
dq = deque()
dq.append(2)
dq.append(5)
dq.appendleft('a')
dq.appendleft('b')
dq.appendleft('b')
print(dq) 
dq.insert(2,'123')
print(dq)

执行结果:
deque(['b', 'b', 'a', 2, 5])
deque(['b', 'b', '123', 'a', 2, 5])